home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / FPSE_src / sio.c < prev    next >
C/C++ Source or Header  |  2000-01-01  |  4KB  |  192 lines

  1. /*
  2.      SIO -- PSX serial driver
  3.         ========================
  4.  
  5.         Written by LDChen
  6. */
  7.  
  8. #include "fpse.h"
  9.  
  10. SIO_Type Sio0;
  11. SIO_Type Sio1;
  12.  
  13. static FifoTable[4] = { 1, 2, 4, 8 };
  14.  
  15. static void dummy() {}
  16.  
  17. int sio_init()
  18. {
  19.     memset(&Sio0,0,sizeof(Sio0));
  20.     memset(&Sio1,0,sizeof(Sio1));
  21.     Sio0.Status = Sio1.Status = TX_EMPTY | TX_RDY;
  22.     Sio0.Mode = Sio1.Mode = PRESCALER1 | BYTE8BIT | STOP1BIT;
  23.     Sio0.Baud = Sio1.Baud = SIOBAUDCLOCK/2400;
  24.     Sio0.FifoSize = Sio1.FifoSize = 1;
  25.     Sio0.IrqLevel = INT_SIO0;
  26.     Sio1.IrqLevel = INT_SIO1;
  27.     Sio0.IrqSrc   = SIO_IRQ_IMM;
  28.     Sio1.IrqSrc   = SIO_IRQ_IMM;
  29.  
  30. // Configure SIO0
  31.     if (PAD_Init(&Sio0) == FPSE_ERR)
  32.     {
  33.         printf("Failed GAMEPAD initialization.\n");
  34.         return FPSE_ERR;
  35.     }
  36.     Sio0.UpdateStatus = PAD_UpdateStatus;
  37.     Sio0.WriteData = PAD_WriteData;
  38.  
  39. // Configure SIO1
  40.     if (useserial)
  41.     {
  42.         if (RS232_Init(&Sio1) == FPSE_ERR)
  43.         {
  44.             printf("Failed Rs232 initialization.\n");
  45.             return FPSE_ERR;
  46.         }
  47.         Sio1.UpdateStatus = RS232_UpdateStatus;
  48.         Sio1.WriteData = RS232_WriteData;
  49.     } else {
  50.         Sio1.UpdateStatus = dummy;
  51.         Sio1.WriteData = dummy;
  52.     }
  53.  
  54.     return FPSE_OK;
  55. }
  56.  
  57. void sio_control_write(SIO_Type *sio, int data)
  58. {
  59.  sio->Ctrl.Control16 = data & ~ERROR_RESET;
  60.  sio->FifoSize = FifoTable[sio->Ctrl.Control8.Irq & 3];
  61.  if (data & ERROR_RESET) sio->Status &= ~SIO_IRQ;
  62.  sio->UpdateStatus(sio);
  63. }
  64.  
  65. void sio_baud_write(SIO_Type *sio, int data)
  66. {
  67.  sio->Baud = data;
  68.  sio->UpdateStatus(sio);
  69. }
  70.  
  71. void sio_mode_write(SIO_Type *sio, int data)
  72. {
  73.  sio->Mode = data;
  74.  sio->UpdateStatus(sio);
  75. }
  76.  
  77. int sio_readdata8 (SIO_Type *sio)
  78. {
  79.  int ret = 0;
  80.  
  81.  if (sio->RxNum)
  82.     {
  83.         ret = sio->RxBuf[sio->RxStart];
  84.         if (++sio->RxStart >= MAXIOBUF)
  85.             sio->RxStart = 0;
  86.         if (!(--sio->RxNum))
  87.             sio->Status &= ~RX_RDY;
  88.         sio->Status &= ~RX_OVERRUN;
  89.     }
  90.  return ret;
  91. }
  92.  
  93. int sio_readdata16(SIO_Type *sio)
  94. {
  95.  return (sio_readdata8(sio))      |
  96.         (sio_readdata8(sio) << 8);
  97. }
  98.  
  99. int sio_readdata32(SIO_Type *sio)
  100. {
  101.  return (sio_readdata8(sio))       |
  102.         (sio_readdata8(sio) << 8)  |
  103.         (sio_readdata8(sio) << 16) |
  104.         (sio_readdata8(sio) << 24);
  105. }
  106.  
  107. void sio_writedata8(SIO_Type *sio, int data)
  108. {
  109.  sio->Status &= ~TX_EMPTY;
  110.  sio->TxBuf[sio->TxNum] = (UINT8)data;
  111.  if (++sio->TxNum >= sio->FifoSize)
  112.     {
  113.         sio->Status &= ~TX_RDY;
  114.         if (sio->Ctrl.Control8.Line & TxENABLE)
  115.             {
  116.                 sio->WriteData(sio);
  117.                 sio->TxNum = 0;
  118.                 sio->Status |= (TX_RDY | TX_EMPTY);
  119.                 if (sio->Ctrl.Control8.Irq & TxIRQ)
  120.                     {
  121.                         Irq_Pulse |= sio->IrqLevel;
  122.                         sio->Status |= SIO_IRQ;                        
  123.                     }
  124.             }
  125.     }
  126. }
  127.  
  128. void sio_writedata16(SIO_Type *sio, int data)
  129. {
  130.  sio_writedata8(sio,data);
  131.  sio_writedata8(sio,data >> 8);
  132. }
  133.  
  134. void sio_writedata32(SIO_Type *sio, int data)
  135. {
  136.  sio_writedata8(sio,data);
  137.  sio_writedata8(sio,data >> 8);
  138.  sio_writedata8(sio,data >> 16);
  139.  sio_writedata8(sio,data >> 24);
  140. }
  141.  
  142. int sio_async(SIO_Type *sio, char *buf, int len)
  143. {
  144.  int n,k;
  145.  
  146.  n = sio->FifoSize - sio->RxNum;
  147.  if (len > n)
  148.     {
  149.         len = n;
  150.         sio->Status |= RX_OVERRUN;
  151.     }
  152.  if (len)
  153.     {
  154.         k = sio->RxEnd;
  155.         for (n=0; n<len; n++)
  156.             {
  157.                 sio->RxBuf[k] = buf[n];
  158.                 if (++k >= MAXIOBUF)
  159.                     k=0;
  160.             }
  161.         sio->RxEnd = k;
  162.         sio->RxNum += n;
  163.         if ((sio->RxNum >= sio->FifoSize) && (sio->Ctrl.Control8.Irq & RxIRQ))
  164.             {
  165.                 Irq_Pulse |= sio->IrqLevel;
  166.                 sio->Status |= SIO_IRQ;
  167.             }
  168.         sio->Status |= RX_RDY;
  169.     }
  170.  
  171.  if ((sio->Ctrl.Control8.Irq & DSRIRQ) && 
  172.      (sio->Delta & DSR))
  173.  {
  174.     sio->Status |= SIO_IRQ;
  175.     sio->Delta &= ~DSR;
  176.     switch (sio->IrqSrc) {
  177.     case SIO_IRQ_IMM:
  178.         Irq_Pulse |= sio->IrqLevel;
  179.     case SIO_IRQ_NONE:
  180.         break;
  181.     case SIO_IRQ_ASYNC:
  182.         Event_Register |= Event_Mask[sio->IrqLevel] | 0x80000000;
  183.         Event_List[sio->IrqLevel] = sio->IrqFlags; // & 0x7FFFFFFF;
  184.         break;
  185.     case SIO_IRQ_VSYNC:
  186.         VSync_Register |= Event_Mask[sio->IrqLevel] | 0x80000000;
  187.         Event_List[sio->IrqLevel] = sio->IrqFlags; // & 0x7FFFFFFF;
  188.         break;
  189.     }
  190.  }
  191.  return len;
  192. }